# encoding: utf-8

from PyQt5.Qt import *
from widget.daoru_page.target_init_page.mysql_target_init import MySqlInitPage
from widget.daoru_page.target_init_page.system_target_init import SystemInitPage
from widget.daoru_page.source_init_page.sqlserver_source_init import SqlServerInitPage
from widget.daoru_page.import_init_page.daoru_page_table import Sqlserver2EsTable
# from widget.daoru_page.import_init_page.daoru_page_table import Excl2EsTable
from widget.daoru_page.source_init_page.excl_source_init import ExclInitFunc
from widget.daoru_page.source_init_page.marc_source_init import MarcInitPage
from widget.daoru_page.source_init_page.choice_excl_sheet_window import ChoiceExclSheetWindow
from widget.daoru_page.source_init_page.noteexpress_source_init import NoteexpressInitFunc
# from widget.daoru_page.source_init_page.choice_noteexpress_type_window import ChoiceNoteexpressTypeWindow
from widget.my_window import MyWindow
from widget.info_box import *
import configparser
import json
from widget.db_init.peewee import testModel229_dp
from widget.db_init.configuration import sql_configuration as LM
from widget.db_init.sqlUtils.mysqlUtils import MySqlOp
import _thread
import time
import xlrd
import xlwt
from widget.utils.utils import RequestsOp
import requests
from widget.utils.utils import CfOp
from widget.my_window import ExtendedComboBox


class MyInitPage(QWidget):
    '''
    导入页面
    '''
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.setAttribute(Qt.WA_StyledBackground, True)
        self.my_parent = args[0]
        self.setParent(self.my_parent)
        # 设置控件名，用来统一显示隐藏控件
        self.setObjectName('the_base_page')

        # 客户信息
        self.custom_list = []

        # 应用信息
        self.application_list = []

        # 初始化读写配置文件类
        self.cfop = CfOp(qApp.cx_project_root + r'/init_file/init/es_db_init.ini')

        # 基本配置页面,挂载到右侧操作控件
        self.setup_content_init()
        # 加载页面配置
        self.init_page()

        # 初始化底部按钮
        self.init_bottom_btns()

    # =========================== 界面 =========================================================================
    def setup_content_init(self):
        '''
        基本配置页面控件
        :return:
        '''
        # 页面初始化
        # 基础面板位置
        self.base_widget = QWidget(self)
        # print(self.parent().width(), self.parent().height())
        self.base_widget.setGeometry(20, 50, self.parent().width() - 20, self.parent().height() - 50)

        # 第一行 ---------------------------------------------------
        self.system_ip_label = QLabel(text='输入平台根路径：')
        self.system_ip_label.setFixedWidth(120)
        self.system_ip_input = QLineEdit()
        self.system_ip_input.setFixedWidth(300)
        self.system_ip_btn = QPushButton('测试连接')
        self.system_ip_btn.clicked.connect(self.test_and_save_ip)

        row0 = QHBoxLayout()
        row0.addWidget(self.system_ip_label)
        row0.addWidget(self.system_ip_input)
        row0.addStretch(1)  # 站位分割
        row0.addWidget(self.system_ip_btn)

        row0.addStretch(30)  # 站位分割

        # 第二行 ---------------------------------------------------
        self.custom_choice_label = QLabel(text='选择客户：')
        self.custom_choice_label.setFixedWidth(120)
        self.custom_choice_combox = ExtendedComboBox()
        self.custom_choice_combox.setFixedWidth(300)
        self.custom_choice_combox.setView(QListView())  # 通过setView和全局qss设置行高

        row1 = QHBoxLayout()
        row1.addWidget(self.custom_choice_label)
        row1.addWidget(self.custom_choice_combox)

        row1.addStretch(1)  # 站位分割

        # 第三行 ---------------------------------------------------
        self.application_choice_label = QLabel(text='选择系统类型：')
        self.application_choice_label.setFixedWidth(120)
        self.application_choice_combox = QComboBox()
        self.application_choice_combox.setFixedWidth(300)
        self.application_choice_combox.setView(QListView())  # 通过setView和全局qss设置行高
        self.application_create_sys_msg_btn = QPushButton(text='创建系统信息')
        self.application_create_sys_msg_btn.clicked.connect(self.create_sys_msg)
        self.application_add_sys_msg_btn = QPushButton(text='增加新的系统信息')
        self.application_add_sys_msg_btn.clicked.connect(self.add_sys_msg_page)

        row2 = QHBoxLayout()
        row2.addWidget(self.application_choice_label)
        row2.addWidget(self.application_choice_combox)
        row2.addStretch(1)  # 站位分割
        row2.addWidget(self.application_create_sys_msg_btn)
        row2.addStretch(1)  # 站位分割
        row2.addWidget(self.application_add_sys_msg_btn)
        row2.addStretch(25)  # 站位分割

        # 提示信息
        self.notice_msg_label = QLabel(text='PS:根路径为平台的 IP地址 + / + 应用名， 例如：http://192.168.0.139:8080/platform')
        rowm = QHBoxLayout()
        rowm.addWidget(self.notice_msg_label)

        # 分割线
        self.line_label = QLabel(text='-'*120)
        rown = QHBoxLayout()
        rown.addWidget(self.line_label)


        # 行插入列，并调整间隔 ---------------------------------------------------
        vbox = QVBoxLayout()
        vbox.addStretch(2)  # 站位分割
        vbox.addLayout(row0)
        vbox.addStretch(1)  # 站位分割
        vbox.addLayout(rowm)
        vbox.addStretch(2)  # 站位分割
        vbox.addLayout(rown)
        vbox.addStretch(2)  # 站位分割
        vbox.addLayout(row1)
        vbox.addStretch(2)  # 站位分割
        vbox.addLayout(row2)
        vbox.addStretch(20)  # 站位分割
        # vbox.addLayout(row_last)

        self.base_widget.setLayout(vbox)


        # 基础页面显示隐藏的方法 start -------------------------------------------
        # 初始化完成后先隐藏控件，等待按钮点击后显示
        self.close()
        # 基本配置按钮被点击时， 隐藏其他页面
        daoru_menu_btn = self.parent().parent().findChild(QPushButton, 'base_init_btn')
        # 关闭其他基础页面的方法
        def close_other_pages():
            other_pages = self.parent().parent().findChildren(QWidget, 'the_base_page')
            for other_page in other_pages:
                other_page.close()
        # 触发关闭其他基础页面的按钮
        daoru_menu_btn.clicked.connect(close_other_pages)
        # 显示对应页面
        daoru_menu_btn.clicked.connect(self.show)
        daoru_menu_btn.clicked.connect(self.my_parent.show)
        # 基础页面显示隐藏的方法 end -------------------------------------------

    def init_bottom_btns(self):
        '''
        初始化底部按钮
        :return:
        '''
        self.enter_btn = QPushButton(parent=self, text='保存配置')
        self.enter_btn.resize(100, 40)
        self.enter_btn.move(self.parent().width() - 300, self.parent().height() - 100)

        # 点击确定将 客户 和 系统类型 挂载到全局
        self.enter_btn.clicked.connect(self.save_base_init)
        # self.cancel_btn = QPushButton(parent=self, text='取消')
        # self.cancel_btn.clicked.connect(self.close)
        # self.cancel_btn.move(self.parent().width() - 210, self.parent().height() - 50)

    # =========================== 业务 =========================================================================
    def init_page(self):
        '''
        初始化页面配置
        :return:
        '''
        ip = self.cfop.get_option("es_db_init", "server_name")
        if ip:
            # es的ip赋值给输入框
            self.system_ip_input.setText(ip)
            # es的ip赋值给全局变量
            qApp.cx_es_db_ip = ip

            # ip存在就自动测试连接
            self.system_ip_btn.click()

    def get_custom_list(self, es_ip):
        '''
        获取客户列表，成功就往combox中加，失败就给提示框
        :return:
        '''
        # 'http://192.168.0.230:8085'
        url = es_ip + '/dataprocessingapi/systeminfo/getcustomerinfolist.action'
        print(url)
        # url = 'http://192.168.0.230:8085/platform/dataprocessingapi/systeminfo/entitytypelist.action?customerocde=1878'
        res = requests.get(url, timeout=0.5)
        if res.status_code != 200:
            self.info_box = InfoBox('连接失败，状态码：{0}，请检查\n1.基本信息中的系统平台ip是否填写或填写是否正确\n2.网络是否通畅'.format(res.status_code))
            self.info_box.show()
            return
        # res.encoding = 'utf-8'
        print(res.text)
        # print(res.status_code)
        # print(res)
        # field_dict = json.loads(res.text) if res.text else None
        # print(field_dict)
        res = json.loads(res.text)
        if res['cxajaxrc'] != "0":
            self.info_box = InfoBox(res['cxajaxerrmsg'])
            self.info_box.show()

        # 客户列表赋值
        self.custom_list = res['returnvalue']['customerinfolist']
        # 客户信息放到combox中
        self.custom_choice_combox.clear()
        self.custom_choice_combox.addItems([name['name'] for name in self.custom_list])

    def get_application_list(self, es_ip):
        '''
        获取应用类型列表，成功就往combox中加，失败就给提示框
        :return:
        '''
        # 'http://192.168.0.230:8085'
        url = es_ip + '/dataprocessingapi/systeminfo/getapplicationinfolist.action'
        print(url)
        res = requests.get(url, timeout=0.5)
        if res.status_code != 200:
            self.info_box = InfoBox('连接失败，状态码：{0}，请检查\n1.基本信息中的系统平台ip是否填写或填写是否正确\n2.网络是否通畅'.format(res.status_code))
            self.info_box.show()
            return
        print(res.text)
        res = json.loads(res.text)
        if res['cxajaxrc'] != "0":
            # print(res['cxajaxerrmsg'])
            self.info_box = InfoBox(res['cxajaxerrmsg'])
            self.info_box.show()
            return

        # 应用类型列表赋值
        self.application_list = res['returnvalue']['sysinfolist']
        # 应用类型信息放到combox中
        self.application_choice_combox.clear()
        self.application_choice_combox.addItems([name['applicationname'] for name in self.application_list])

    def create_sys_msg(self):
        '''
        创建系统信息
        :return:
        '''
        # 生成默认的系统信息配置接口
        url = qApp.cx_es_db_ip + '/dataprocessingapi/systeminfo/createsysinfolist.action'
        res = requests.get(url, timeout=0.5)
        res = json.loads(res.text)
        if res['cxajaxrc'] != '0':
            self.info_box = InfoBox(res['cxajaxerrmsg'])
            self.info_box.show()
        else:
            self.info_box = InfoBox('系统信息创建成功')
            self.info_box.show()

    def add_sys_msg_page(self):
        self.custom_box = CustomBox('增加新的系统信息', width=500, height=250)

        self.custom_box.add_sys_msg_widget = QWidget(self.custom_box)
        self.custom_box.add_sys_msg_widget.setGeometry(50, 50, self.custom_box.width() - 100, self.custom_box.height() - 100)

        self.add_sys_msg_label1 = QLabel('新的系统ID:')
        self.add_sys_msg_input1 = QLineEdit()
        self.add_sys_msg_label2 = QLabel('PS:新的系统ID标识通常使用客户简称+系统名缩写')
        self.add_sys_msg_label3 = QLabel('系统中文名:')
        self.add_sys_msg_input3 = QLineEdit()

        row0 = QHBoxLayout()
        row0.addWidget(self.add_sys_msg_label1)
        row0.addWidget(self.add_sys_msg_input1)
        row1 = QHBoxLayout()
        row1.addWidget(self.add_sys_msg_label2)
        row2 = QHBoxLayout()
        row2.addWidget(self.add_sys_msg_label3)
        row2.addWidget(self.add_sys_msg_input3)

        vbox = QVBoxLayout()
        vbox.addStretch(1)  # 站位分割
        vbox.addLayout(row0)
        vbox.addStretch(1)  # 站位分割
        vbox.addLayout(row1)
        vbox.addStretch(3)  # 站位分割
        vbox.addLayout(row2)
        vbox.addStretch(2)  # 站位分割

        self.custom_box.add_sys_msg_widget.setLayout(vbox)

        # 点击确定创建新 系统信息
        self.custom_box.enter_btn.clicked.connect(self.add_sys_msg)

        self.custom_box.show()

    def add_sys_msg(self):
        '''
        增加 新系统信息 接口
         {
            "applicationid": "使用客户简称+应用名缩写"，
            "name":"应用中文名称"
         }
        :return:
        '''
        new_sys_id = self.add_sys_msg_input1.text()
        new_sys_name = self.add_sys_msg_input3.text()
        # print(new_sys_id)
        # print(new_sys_name)
        if not new_sys_id or not new_sys_name:
            self.info_box = InfoBox('请输入 系统id 和 系统中文名')
            self.info_box.show()
            return

        url = qApp.cx_es_db_ip + '/dataprocessingapi/systeminfo/updatesysinfolist.action'
        params = {'applicationid': new_sys_id, 'name': new_sys_name}
        res = requests.get(url, timeout=0.5, params=params)

        if res.status_code != 200:
            self.info_box = InfoBox('连接失败，状态码：{0}'.format(res.status_code))
            self.info_box.show()
            return
        res = json.loads(res.text)

        if res['cxajaxrc'] != '0':
            self.info_box = InfoBox(res['cxajaxerrmsg'])
            self.info_box.show()
            return

        self.info_box = InfoBox('系统信息创建成功')
        self.info_box.show()
        self.system_ip_btn.click()    # 点击此按钮会刷新系统信息选择框，所以点它就完了

    def test_and_save_ip(self):
        '''
        测试系统平台ip是否正确
        测试方式就是请求 客户列表接口 和 应用列表接口
        如果 接口跑的通，说明ip正确，
        如果 客户接口跑的通， 应用的跑不通，说明该平台没有 创建系统信息，提示用户点击按钮去创建
        :return:
        '''

        '''
        如果 ip输入框中有值 就会执行这个方法，测试连接并将 客户 和 系统信息 挂载到全局
        '''
        cx_es_db_ip = self.system_ip_input.text()

        # cx_es_db_ip = server_name + '/platform'

        if not cx_es_db_ip:
            self.info_box = InfoBox("请输入平台根路径")
            # self.info_box = InfoBox("错误信息{0}".format(e))
            # self.info_box.setWindowFlag(Qt.WindowStaysOnTopHint)
            self.info_box.show()
            return

        # # 保存ip
        # self.cfop.save_option("es_db_init", "server_name", str(cx_es_db_ip))
        # # cf = self.get_init_file_cf()
        # # cf.set("es_db_init", "server_name", cx_es_db_ip)
        # # self.init_write(cf)
        #
        # # 挂载到全局
        # qApp.cx_es_db_ip = cx_es_db_ip

        try:
            self.get_custom_list(cx_es_db_ip)
        except Exception as e:
            print(e)
            self.info_box = InfoBox('连接失败，请检查\n1.基本信息中的系统平台ip是否填写或填写是否正确\n2.网络是否通畅')
            self.info_box.show()
            return

        # 请求客户信息放到combox中
        self.get_custom_list(cx_es_db_ip)
        # 如果配置文件中有 客户 那么使用配置文件中的客户
        cur_cust = self.cfop.get_option('es_db_init', "custom_dict")
        if cur_cust:
            cur_cust = json.loads(cur_cust)
            for i, cust in enumerate(self.custom_list):
                if cust['RUID'] == cur_cust['RUID']:
                    self.custom_choice_combox.setCurrentIndex(i)
                    qApp.cur_custom_dict = cur_cust    # 当前客户挂载到全局

        # 请求应用信息放到combox中
        self.get_application_list(cx_es_db_ip)
        # 如果配置文件中有 系统信息 那么使用配置文件中的系统信息
        cur_app = self.cfop.get_option('es_db_init', "application_dict")
        if cur_app:
            cur_app = json.loads(cur_app)
            for i, app in enumerate(self.application_list):
                if app['applicationid'] == cur_app['applicationid']:
                    self.application_choice_combox.setCurrentIndex(i)
                    qApp.cur_application_dict = cur_app    # 当前应用挂载到全局

    def save_base_init(self):
        '''
        点击保存配置，将 客户 和 系统类型 挂载到全局
        :return:
        '''
        cust_index = self.custom_choice_combox.currentIndex() if self.custom_choice_combox.currentText() else -1
        app_index = self.application_choice_combox.currentIndex() if self.application_choice_combox.currentText() else -1

        if cust_index == -1 or app_index == -1:
            self.info_box = InfoBox('未选择客户 或 系统类型')
            self.info_box.show()
            return
        cust = self.custom_list[cust_index]
        print(cust)
        app = self.application_list[app_index]
        print(app)

        # 挂载当前客户到全局 并 保存到配置文件
        qApp.cur_custom_dict = cust
        self.cfop.save_option("es_db_init", "custom_dict", str(cust))
        # 挂载当前应用到全局 并 保存到配置文件
        qApp.cur_application_dict = app
        self.cfop.save_option("es_db_init", "application_dict", str(app))
        # 保存当前es的ip 并 保存到配置文件
        cx_es_db_ip = self.system_ip_input.text()
        # cx_es_db_ip = server_name + '/platform'

        if not cx_es_db_ip:
            self.info_box = InfoBox("平台ip为空")
            # self.info_box = InfoBox("错误信息{0}".format(e))
            # self.info_box.setWindowFlag(Qt.WindowStaysOnTopHint)
            self.info_box.show()
            return
        qApp.cx_es_db_ip = cx_es_db_ip
        self.cfop.save_option("es_db_init", "server_name", str(cx_es_db_ip))

        self.info_box = InfoBox('配置保存成功')
        self.info_box.show()